package com.stream;


import java.util.Comparator;
import java.util.TreeSet;

/**
 * lambda 的demo
 */
public class LambdaTest {
    /**
     * @param args
     */
    public static void main(String[] args) {
        //第一种方式
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("run....");
            }
        };
        new Thread(runnable).start();

        //第二种方式
        Runnable runnable1 = () -> {
            System.out.println("第二种编写方式");
        };
        new Thread(runnable1).start();

        //第三种方式
        new Thread(() -> {
            System.out.println("第三中编写方式");
        }).start();

        //第四种方式
        //@2.如果形参列表为空，只需要保留();
        new Thread(() -> System.out.println("第四种编写方式")).start();

        new Thread(() -> {
            System.out.println("第三中编写方式");
        }).start();
    }


}

class comparator {
    public static void main(String[] args) {
        //匿名内部类
        //@5.lambda不会生成一个单独的内部类文件,和这个匿名内部类对比
        Comparator<String> comparator = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.length() - o2.length();
            }
        };
        TreeSet<String> strings = new TreeSet<>(comparator);

        //lambda表达式
        //@1.形参列表的数据类型会自动推断
        TreeSet<String> objects = new TreeSet<>((o1, o2) -> o1.length() - o2.length());

        //@3.如果形参只有1个，()可以省略，只需要参数的名称即可
        MathOperation operation = a -> {
            System.out.println("a");
            return a;
        };

        //@4.如果执行语句只有1句，且无返回值，{}可以省略，若有返回值，则若想省去{}，
        //则必须同时省略retrun,且执行语句也保证只有1句；
        MathOperationOne operationOne = () -> 1;

        //@6.lambda表达式若访问了局部变量，则局部变量必须是final的，若是局部变量
        //没有加final关键字，系统会自动添加，此后修改改局部变量，会报错；
        int num = 1;
        MathOperationOne operationTwo = () -> num;
        //num = 5;

    }
}

interface MathOperation {
    int operation(int a);
}

interface MathOperationOne {
    int operation();
}



